# 14. set集合数据类型

# 集合类型(set)

set集合是Python的一个基本数据类型,一般不是很常用

set中的元素不能重复的、无序的、可hash的(整形,字符串,元组,布尔)

set集合类型类似于dict字典类型,但是没有value值,只有key值,也是用 { } 中括号(花括号) 表示

set集合类型中的元素必须是可hash的,但是set集合类型本身是不可hash的,所以set类型中的值是可变的

so = {"江凡","江小凡","江凡凡","江凡",1,2,3,True,True}
print(so)

执行结果:
{1, 2, 3, '江凡凡', '江小凡', '江凡'}

​ 以上实例,在set的特性中,去重复,无序

# 列表去重

如有一个列表,需要给他去重,可以使用set类型

注意:通过这种方式,列表的顺序会发生改变

so = ["江凡","江小凡","江凡凡","江凡",1,2,3]
so = set(so)
wo = list(so)
print("set类型下:",so)
print("使用set类型后去重的结果:",wo)

执行结果:
set类型下: {1, 2, 3, '江凡', '江凡凡', '江小凡'}
使用set类型后去重的结果: [1, 2, 3, '江凡', '江凡凡', '江小凡']

​ 以上实例,先把列表转成集合,在转成列表就完成了去重操作,不过注意,这样子完成后,顺序会改变

# set集合类型 增 删 改 查

# 增加

# 增加 - add()

使用add()函数对集合进行增加内容

如果有重复的内容是不会被添加进set集合中的

格式:变量.add(值)

so = {"江凡","江小凡","江凡凡"}
so.add("江国凡")
print(so)

执行结果:
{'江凡凡', '江凡', '江国凡', '江小凡'}

​ 以上实例,使用add()函数进行增加

so = {'江凡凡', '江凡', '江国凡', '江小凡'}
so.add("江国凡")
print(so)

执行结果:
{'江凡', '江小凡', '江国凡', '江凡凡'}

​ 以上实例,使用add()函数进行增加,但是增加的内容在原来的集合中以存在,默认是不增加,而不是集合的去重特性

# 迭代更新(多集合增加) - update()

迭代增加,是通过增加的内容,一个值或元素都是独立的集合元素,类似for循环

格式:变量.update(值)

so = {"江凡","江小凡","江凡凡"}
so.update("江国凡")
print(so)

执行结果:
{'江', '国', '江小凡', '凡', '江凡', '江凡凡'}

​ 以上实例,增加的内容"江国凡",增加后,每个值都是独立的集合元素

# 删除

# 删除 (随机删除)- pop()

通过pop()删除集合中的元素,默认是删除最后一个

因为set集合是无序的,每次执行的结果都不一样,所以使用pop()函数删除的时候删除的内容也是随机的

格式:变量.pop()

so = {'江凡凡', '江凡', '江国凡', '江小凡'}
wo = so.pop()
print("删除值:",wo)
print(so)

执行结果:
删除值: 江凡凡
{'江凡', '江国凡', '江小凡'}

​ 以上实例,通过pop()函数删除在根据set集合的特性,所以得出的结果,随机删除

​ pop()函数是可以返回删除值的

# 指定元素删除 - remove()

指定集合中的元素删除,如果元素不存在,程序报错

格式:变量.remove(值)

so = {'江凡凡', '江凡', '江国凡', '江小凡'}
wo = so.remove("江凡")
print(so)

执行结果:
{'江国凡', '江小凡', '江凡凡'}

# 清空集合 - clear()

使用clear()函数可以清空集合,返回值:set()

注意:set集合如果是空,打印出来的是set(),因为要和dict字典区分开

格式:变量.clear()

so = {'江凡凡', '江凡', '江国凡', '江小凡'}
so.clear()
print(so)

执行结果:
set()

# 修改

在set集合中的数据没有索引,也没办法去定位一个元素,所以没办法直接修改

但是可以采用先删除后添加的方式来完成修改操作

要求:{'江凡凡', '江凡', '江国凡', '江小凡'},把江凡改成江江凡

so = {'江凡凡', '江凡', '江国凡', '江小凡'}
so.remove("江凡")
so.add("江江凡")
print(so)

执行结果:
{'江国凡', '江江凡', '江凡凡', '江小凡'}

# 查询 - for循环查询

set集合是一个可迭代对象,所以可以进行for循环

so = {'江凡凡', '江凡', '江国凡', '江小凡'}
for i in so:
    print(i)
    
执行结果:
江凡
江小凡
江国凡
江凡凡

# set集合的常用操作

# 交集 - intersection()

查看两个集合中的共有元素,就是查看二个集合中的相同元素

格式:

  1. 集合1.intersection(集合2)

    so = {'江凡凡', '江凡', '江国凡'}
    wo = {'江国凡', '江小凡','江江凡'}
    print(so.intersection(wo))
    
    执行结果:
    {'江国凡'}
    

    ​ 以上实例,通过 intersection()函数来找到二个集合的相同元素

  2. 集合1 & 集合2

    so = {'江凡凡', '江凡', '江国凡'}
    wo = {'江国凡', '江小凡','江江凡'}
    print(so & wo)
    
    执行结果:
    {'江国凡'}
    

    ​ 以上实例,通过 & 运算符来找到二个集合的相同元素

# 反交集 - symmetric_difference()

看到名字就知道了这函数的用法吧

反交集的用法跟交集一样,不过得到的结果的是相反的

反交集,获取二个集合中单独存在的数据

格式:

  1. 集合1.symmetric_difference(集合2)

    so = {'江凡凡', '江凡', '江国凡'}
    wo = {'江国凡', '江小凡','江江凡'}
    print(so.symmetric_difference(wo))
    
    执行结果:
    {'江凡', '江江凡', '江凡凡', '江小凡'}
    

    ​ 以上实例,通过 symmetric_difference()函数来找到二个集合的非相同元素

  2. 集合1 ^ 集合2

so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so ^ wo)

执行结果:
{'江江凡', '江凡凡', '江小凡', '江凡'}

​ 以上实例,通过 ^ 运算符,来找到二个集合的非相同元素

# 并集 - union()

把二个集合的元素合并输出

格式:

  1. 集合1.union(集合2)

    so = {'江凡凡', '江凡', '江国凡'}
    wo = {'江国凡', '江小凡','江江凡'}
    print(so.union(wo))
    
    执行结果:
    {'江小凡', '江凡', '江江凡', '江凡凡', '江国凡'}
    

    ​ 以上实例,通过union() 函数把二个集合的元素合并输出

    ​ 注意:因set集合的特性,就算是二个集合合并如果有相同的元素,set集合也是会进行去重操作

  2. 集合1 | 集合2

so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so | wo)

执行结果:
{'江江凡', '江凡', '江凡凡', '江国凡', '江小凡'}

​ 以上实例,通过 | 运算符,把二个集合的元素合并输出

​ 注意:因set集合的特性,就算是二个集合合并如果有相同的元素,set集合也是会进行去重操作

# 差集 - difference()

差集,二个集合对比,获取第一个集合的单独元素(不重复的元素)

格式:

  1. 集合1.difference(集合2)
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so.difference(wo))

执行结果:
{'江凡', '江凡凡'}

​ 以上实例,通过difference()函数,将集合1跟集合2对比去重,获取集合1 非重复的元素

  1. 集合1 - 集合2
so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so - wo)

执行结果:
{'江凡凡', '江凡'}

​ 以上实例,通过 - 运算符,将集合1跟集合2对比去重,获取集合1 非重复的元素

# 子集 - issubset()

查看集合1是集合2的子集吗,科学数学运算

返回值:True / False

格式:

  1. 集合1.issubset(集合2)

    so = {'江凡凡', '江凡', '江国凡'}
    wo = {'江国凡', '江小凡','江江凡'}
    print(so.issubset(wo))
    
    执行结果:
    False
    

    ​ 以上实例,通过issubset()函数,对比集合1 是否是 集合2 的子集

  2. 集合1 < 集合2

so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so < wo)

执行结果:
False

​ 以上实例,通过 < 运算符,对比集合1 是否是 集合2 的子集

# 超集 - issuperset()

查看集合1是集合2的超集吗,科学数学运算

返回值:True / False

格式:

  1. 集合1.issuperset(集合2)

    so = {'江凡凡', '江凡', '江国凡'}
    wo = {'江国凡', '江小凡','江江凡'}
    print(so.issuperset(wo))
    
    执行结果:
    False
    

    ​ 以上实例,通过issuperset()函数,对比集合1 是否是 集合2 的超集

  2. 集合1 < 集合2

so = {'江凡凡', '江凡', '江国凡'}
wo = {'江国凡', '江小凡','江江凡'}
print(so > wo)

执行结果:
False

​ 以上实例,通过 > 运算符,对比集合1 是否是 集合2 的超集

# 数据保存 - frozenset()

set 集合本身是可以发生改变的,是不可hash的,可以使用frozenset()函数 来保存数据

frozenset()函数 是不可变的,也就是一个可哈希的数据类型

so = frozenset(['江凡凡', '江凡', '江国凡','江小凡','江江凡'])
wo = {so:"123"}
print("frozenset()函数的数据类型:",type(so))
print(wo)
for i in so:
    print(i)
    
执行结果:
frozenset()函数的数据类型: <class 'frozenset'>
{frozenset({'江凡凡', '江国凡', '江凡', '江小凡', '江江凡'}): '123'}
江凡凡
江国凡
江凡
江小凡
江江凡